package com.cloud.async.business.context;

import com.cloud.async.business.core.DataSourceAsyncBusiness;

import java.util.concurrent.CompletableFuture;

/**
 * @author chengrui
 * @title: ApplicationContext
 * @projectName webCloudAsync
 * @description: 相关方法的核心
 * @date 2021/9/23 23:31
 */
public abstract class ApplicationContext implements DataSourceAsyncBusiness {

    /**
     * 保存数据
     * @param key
     * @param value
     * @return
     */
    protected abstract Boolean saveData(String key, CompletableFuture value);

    /**
     * 从数据源中获取结果
     * @param key
     * @return
     */

    /**
     * 释放资源
     * @param key
     */
    protected abstract void releaseData(String key);


    /**
     * 获取结果
     * @param key
     * @return
     */
    public  abstract <T> T getResult(String key);


    /**
     * 获取结果,最大获取结果时间
     * @param key
     * @param milliSecond 为null则使用默认的系统配置时间
     * @return
     */
    public  abstract <T> T getResult(String key, Long milliSecond);


    /**
     * 返回指定类型的key
     * @param key
     * @param requiredType
     * @param <T>
     * @return
     */
    public  abstract <T> T getResult(Class<T> requiredType, String key);

    /**
     * 返回指定类型的key 获取结果时 最大获取结果时间
     * @param milliSecond 为null则使用默认的系统配置时间
     * @param key
     * @param requiredType
     * @param <T>
     * @return
     */
    public  abstract <T> T getResult(Class<T> requiredType, String key, Long milliSecond);

    /**
     * 此方法会影响业务功能不定性，进行删除
     * 获取指定参数类型 通过JSON的key顺序进行深层获取对象
     * @param requiredType
     * @param key
     * @param args
     * @param <T>
     * @return
     */
    //public  abstract <T> T getResult(Class<T> requiredType,String key, String... args);

    /**
     * 此方法会影响业务功能不定性，进行删除
     * 返回结果为JSON字符串，去字符串中找，按输入的args顺序进行获取对象信息  最大获取结果时间
     * @param requiredType
     * @param key
     * @param milliSecond 为null则使用默认的系统配置时间
     * @param args
     * @param <T>
     * @return
     */
    //public  abstract <T> T getResult(Class<T> requiredType,String key, Long milliSecond, String... args);


}
